package geradores;

import java.io.FileNotFoundException;
import java.io.PrintWriter;

import util.ArquivoUtil;

public class GeradorCodigoObjetoToken {

	private PrintWriter arquivoSaidaClasseToken;

	private static String nomeArquivoSaida = "Token";

	private static String caminhoArquivo = "c:\\gerador\\saida\\";

	/**
	 * Construtor Padrão
	 */
	public GeradorCodigoObjetoToken() {
		try {
			this.arquivoSaidaClasseToken = ArquivoUtil.criarArquivo(caminhoArquivo, nomeArquivoSaida + ".java");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Método para gerar a Classe Token
	 */
	public void gerar() {

		ArquivoUtil.escreverArquivo("public class " + nomeArquivoSaida + "{\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("private String imagem;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("private Classe classe;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("private Integer linha;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("private Integer coluna;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("private Integer indice;\n\n", arquivoSaidaClasseToken);

		// INICIO GETS AND SETS

		ArquivoUtil.escreverArquivo("//INICIO GETS AND SETS\n\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("public Classe getClasse() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn classe;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public void setClasse(Classe classe) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.classe = classe;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public Integer getColuna() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn coluna;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public void setColuna(Integer coluna) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.coluna = coluna;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public String getImagem() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn imagem;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public void setImagem(String imagem) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.imagem = imagem;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public Integer getIndice() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn indice;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public void setIndice(Integer indice) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.indice = indice;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public Integer getLinha() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn linha;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("public void setLinha(Integer linha) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.linha = linha;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		// INICIO TOSTRING

		ArquivoUtil.escreverArquivo("//INICIO TOSTRING\n\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo(" @Override \n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("public String toString() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn \"Imagem.: \" + imagem + \" Classe.: \" + classe\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t+ \" Linha.: \" + linha + \" Coluna.: \" + coluna\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t+ \" Indice.: \" + indice;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);

		// INICIO CONSTRUTOR

		ArquivoUtil.escreverArquivo("//INICIO CONSTRUTOR\n\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("public " + nomeArquivoSaida + "(String imagem, Classe classe, Integer linha,\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tInteger coluna, Integer indice) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.imagem = imagem;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.classe = classe;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.linha = linha;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.coluna = coluna;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tthis.indice = indice;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("//HASH CODE\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("@Override\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("public int hashCode() {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tfinal int prime = 31;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tint result = 1;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tresult = prime * result + ((classe == null) ? 0 : classe.hashCode());\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tresult = prime * result + ((coluna == null) ? 0 : coluna.hashCode());\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tresult = prime * result + ((imagem == null) ? 0 : imagem.hashCode());\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tresult = prime * result + ((linha == null) ? 0 : linha.hashCode());\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn result;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);

		ArquivoUtil.escreverArquivo("//EQUALS\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("@Override\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("public boolean equals(Object obj) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tif (this == obj) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn true;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tif (obj == null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\tif (!(obj instanceof Token)) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tToken other = (Token) obj;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tif (classe != other.classe) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tif (coluna == null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\tif (other.coluna != null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t} else if (!coluna.equals(other.coluna)) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tif (imagem == null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\tif (other.imagem != null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t} else if (!imagem.equals(other.imagem)) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\tif (linha == null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\tif (other.linha != null) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t} else if (!linha.equals(other.linha)) {\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\treturn true;\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaClasseToken);
		ArquivoUtil.escreverArquivo("}\n\n", arquivoSaidaClasseToken);
		fechaArquivo();

	}

	/**
	 * Método para fechar o arquivo
	 */
	private void fechaArquivo() {
		ArquivoUtil.fecharArquivo(arquivoSaidaClasseToken);		
	}

}
